package com.zjm.structural.decorator.io;

import java.io.*;

/**
 * IO源码装饰器
 * <p>
 * 1. 组件层次（Component Hierarchy）
 * 在Java I/O中，组件层次由抽象类构成：
 * <p>
 * InputStream/OutputStream：字节流的抽象基类
 * Reader/Writer：字符流的抽象基类
 * 这些抽象类定义了基本的输入输出操作接口，是所有具体流类的共同祖先。
 * <p>
 * 2. 具体组件（Concrete Components）
 * 具体组件是实际执行基本I/O操作的类：
 * <p>
 * FileInputStream/FileOutputStream：文件读写
 * ByteArrayInputStream/ByteArrayOutputStream：字节数组读写
 * StringReader/StringWriter：字符串读写
 * 3. 装饰器基类（Decorator Base Classes）
 * 装饰器基类持有一个指向组件的引用：
 * <p>
 * FilterInputStream/FilterOutputStream：字节流装饰器基类
 * BufferedReader/BufferedWriter：字符流装饰器基类
 * 4. 具体装饰器（Concrete Decorators）
 * 具体装饰器为流添加特定功能：
 * <p>
 * BufferedInputStream/BufferedOutputStream：添加缓冲功能
 * DataInputStream/DataOutputStream：添加基本数据类型读写功能
 * ObjectInputStream/ObjectOutputStream：添加对象序列化功能
 * PrintStream/PrintWriter：添加格式化输出功能
 */
public class InputStreamTest {
    public static void main(String[] args) {
        // 装饰过程
        // 创建基础流：首先创建一个具体的基础流对象（如FileInputStream）
        // 逐层装饰：将基础流作为参数传递给装饰器构造函数，创建装饰后的流
        // 链式调用：可以继续将装饰后的流传递给其他装饰器，形成装饰链
        // 使用功能：通过最外层的流对象调用方法，功能会逐层传递到基础流
        try (InputStream inputStream = new DataInputStream(new FileInputStream(new File("D://test"))) ) {
            inputStream.read();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
